﻿using System;
using System.Collections.Generic;
using System.Text;
using Modele;
        
/**
* @author Quentin Leguay 4Info INSA Rennes 
* @date Avril 2010
* @brief La classe PAN est la classe qui contient le MVC
*/
namespace general{ 

    public class Logiciel
    {
        /***************/
        /** attributs **/
        /***************/

        // Les 3 parties du MVC
        private vue.Vue vue;
        private Modele.Modele modele;
        private Controleur.Controleur controleur;



        /***************/
        /**  méthodes **/
        /***************/

        //Constructeur
        public Logiciel() {
        
        vue = new vue.Vue(this);
        modele = new Modele.Modele(this);
        controleur = new Controleur.Controleur(this);
        
                
        }

        //Accesseurs
        public Controleur.Controleur getControleur()
        {
            return controleur;
        }

        public  void Run()
        {
            vue.Run();
        }



        /*****************/
        /**  Controleur **/
        /*****************/

        /**
         * @brief Appel aux actions des modes
         * @param Strokes _strokes : objet contenant de nombreuses informations (analogue à ensemble de points)
         * @return void
        */
        public void ActionZoneDessin(Microsoft.Ink.Stroke _stroke)
        {
            controleur.ActionZoneDessin(_stroke);
        }

        // clic sur le bouton sur le côté du stylet
        public void ActionBouton()
        {
            controleur.ActionBouton();
        }

        // tracer un trait sur la zone de dessin avec la "gomme"
        public void ActionEffacer(Microsoft.Ink.Strokes _strokes)
        {
            controleur.ActionEffacer(_strokes);
        }


        public void ActionDoubleClic(Microsoft.Ink.Strokes _strokes)
        {
            controleur.ActionDoubleClic(_strokes);
        }

        public void changerMode(Controleur.Mode _mode)
        {
            controleur.changerMode(_mode);
        }

        // Change la couleur du mode
        public void changerCouleur(System.Drawing.Color _couleur)
        {
            controleur.changerCouleur(_couleur);
        }

        public void changerCalqueCourant(int numero_calque)
        {
            controleur.changerCalqueCourant(numero_calque);
        }


        public void creeCalque()
        {
             controleur.creeCalque();
        }


        /**
        * @brief undo
        * @brief remontée de l'évènement undo
        * @param int nb : le nombre d'annulations (actuellement 0)
        * @return int nb : le nombre d'annulations réalisées
        */
        public int undo(int _nb)
        {
            return controleur.undo(_nb);
        }

        /**
        * @brief redo
        * @brief remontée de l'évènement redo
        * @param int nb : le nombre d'annulations (actuellement 0)
        * @return int nb : le nombre d'annulations refaites
        */
        public int redo(int _nb)
        {
            return controleur.redo(_nb);
        }

        /**
        * @brief sendUtilisateur
        * @brief remontée de l'utilisateur
        * @param string _prenom : le prénom de l'utilisateur
        * @param string _nom : le nom de l'utilisateur
        * @return void
        */
        public void sendUtilisateur(string _prenom,string _nom)
        {
            controleur.sendUtilisateur(_prenom,_nom);
        }



        /***************/
        /**    Vue    **/
        /***************/

       /**
        * @brief rafraichirVue
        * @brief demande à la vue de se rafraichir
        * @return void
       */
       public void rafraichirVue(){
           vue.refresh();
        }

       /**
        * @brief rafraichirVue
        * @brief demande à la vue de se rafraichir
        * @return void
        */
        public void completeRefresh()
        {
            
            // MAJ du claque courant
            vue.completeRefresh(modele.getCalqueCourant().getInk(),
                                modele.getCalqueCourant().getAnnotations() ,
                                modele.getCalqueCourant().getTexte());

            vue.changerGraphics(modele.getCombinedInk(),
                                modele.getCombinedAnnotations());

            Console.WriteLine("completeRefresh logiciel");
            // SUITE DES MAJ à faire

        }


       /************
       ** Modèle **
       ************/

       /**
       * @brief analyserStroke
       * @brief demande au logiciel de reconnaitre un stroke
       * @return bool reconnu : indique si le stroke a été reconnu ou non
       */
       public bool analyserStroke(Microsoft.Ink.Stroke _stroke)
       {
           bool reconnu = modele.analyserStroke(_stroke);
           return reconnu;
       }


       /**
        *  @brief addStroke
        *  @brief ajoute un Stroke dans la SDD
        *  @return void
       */
       public List<Microsoft.Ink.Stroke> addStroke(Microsoft.Ink.Stroke _stroke)
       {
           return modele.addStroke(_stroke);
       }

        /**
        *  @brief addInk
        *  @brief ajoute un Ink dans la SDD
        *  @return void
        */
       public List<Microsoft.Ink.Stroke> addInk(Microsoft.Ink.Ink _ink, Microsoft.Ink.DrawingAttributes _attributes)
       {
           return modele.addInk(_ink, _attributes);
       }

       /**
        *  @brief addBalise
        *  @brief ajoute une balise dans la SDD
        *  @return void
        */
       public void addBalise(Balise _balise)
       {
           modele.addBalise(_balise);
       }

       /**
       *  @brief getCalqueCourant()
       *  @brief retourne le calqueCourant
       *  @return Calque : le calque courant
       */
       public Modele.Calque getCalqueCourant()
       {
           return modele.getCalqueCourant();
       }

       public vue.Vue getVue()
       {
           return vue;
       }
        
       public void changeVisibility(int numero_calque)
       {
           modele.changeVisibility(numero_calque);
       }
        /**
        *  @brief deleteStrokes
        *  @brief enlève un Stroke dans la SDD
        *  @return void
       */
        /*
       public void deleteStroke(Microsoft.Ink.Stroke _stroke)
       {
           modele.deleteStroke(_stroke);
       }
        */

       /**
        *  @brief getProjetBlocNote
        *  @brief envoi un pointeur vers le projetBlocNote
        *  @return ProjetBlocNote : le projetBlocNote du modèle
        */
       public Modele.ProjetBlocNote getProjetBlocNote()
       {
           return modele.getProjet();
       }


        /*****************/
        /**  Accesseurs **/
        /*****************/


       /**
        *  @brief getModele
        *  @brief envoi un pointeur vers le modèle. Attention, ne pas faire n'importe quoi avec
        *  @return Modele : modele du logiciel
        */
       public Modele.Modele getModele()
       {
           return modele;
       }

        /**
        *  @brief getModele
        *  @brief envoi un pointeur vers le modèle. Attention, ne pas faire n'importe quoi avec
        *  @return Modele : modele du logiciel
        */
       public void clear()
       {
           controleur.clear();
           this.completeRefresh();
       }

       /*****************/
       /**  Recherche  **/
       /*****************/

       /**
        *  @brief List<System.Drawing.Point> lancer_recherche
        *  @brief permet de lancer la recherche et recupere la list de positions des objets trouvés
        *  @return List<System.Drawing.Point>
        */
       public List<System.Drawing.Point> lancer_recherche(bool recherche_dans_balise,
                                             bool recherche_dans_encre,
                                             bool recherche_dans_texte,
                                             string mot_cle)
       {
           return controleur.lancer_recherche(recherche_dans_balise,
                                                      recherche_dans_encre,
                                                      recherche_dans_texte,
                                                      mot_cle);
       }

       public void sauver(String nomFichier)
       {
           modele.sauver(nomFichier);
       }

       public void ouvrir(String nomFichier)
       {
           modele.ouvrir(nomFichier);
       }

    }
}
